class Solution {

    static constexpr int DIRS[4][2] = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
public:
    vector<int> spiralOrder(vector<vector<int>>& matrix) {
        int m=matrix.size();
        int n=matrix[0].size();

        vector<int> ans(m*n);
        int i=0,j=0,di=0;
        for(int k=0;k<m*n;k++)
        {
            ans[k]=matrix[i][j];
            matrix[i][j]=INT_MAX; //标记为已读

            int x=i+DIRS[di][0];
            int y=j+DIRS[di][1];//下一步位置坐标

            if(x<0||x>=m||y<0||y>=n||matrix[x][y]==INT_MAX)
            {
                di=(di+1)%4;
            }
            i+=DIRS[di][0];
            j+=DIRS[di][1];

        }
        return ans;

    }
};